#pragma once

#include <iostream>
#include <string>
using namespace std;

const string ProSep = "\n";

class Protocol
{
public:
    bool Package(const string &content, string *message)
    {
        string len = to_string(content.size());
        *message = len + ProSep + content + ProSep;
        return true;
    }

    bool Unpackage(string &message, string *content)
    {
        // 在解包时，我们的message可能是以下几种情况：
        // 报文不完整
        // "len
        // "len\n
        // "len\ndata_x
        // 报文完整且独立
        // "len\ndata_x oper data_y\n"
        // 报文完整，但是后续还有完整或者不完整的报文
        // "len\ndata_x oper data_y\n""len\ndata_x oper data_y\n"
        int pos = message.find(ProSep);
        if (pos == string::npos)
            return false;
        string strlens = message.substr(0, pos);
        int content_len = stoi(strlens);
        int total_len = strlens.size() + content_len + ProSep.size() * 2;
        if (total_len > message.size())
            return false;

        *content = message.substr(pos + ProSep.size(), content_len);
        // 截断提取到的报文
        message.erase(0, total_len);
        return true;
    }
};